package com.visutech.common;

import org.apache.commons.collections4.CollectionUtils;
import org.mybatis.spring.SqlSessionTemplate;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;


public class MybatisBaseDao<T> {
    @Resource
    protected SqlSessionTemplate sqlSession;

    /**
     * 查询多条数据
     * @param obj
     * @return
     * @throws Exception
     */
    public List<T> queryList(T obj) throws Exception{
        return sqlSession.selectList(obj.getClass().getName()+".select", obj);
    }

    /**
     * 查询多条数据并限定返回结果集范围
     * @param obj 对象
     * @return
     */
    public List<T> queryListByLimit(T obj)throws Exception{
        if(null != obj){
            return sqlSession.selectList(obj.getClass().getName()+".queryListByLimit", obj);
        }
        return null;
    }

    /**
     * 根据传入参数查询结果数
     * @param obj 对象
     * @return
     */
    public Integer queryRowCount(T obj)throws Exception{
        if(null == obj){
            return null;
        }
        return sqlSession.selectOne(obj.getClass().getName()+".selectRowCount", obj);
    }

    /**
     * 查询一条数据
     * @param obj
     * @return
     * @throws Exception
     */
    public T query(T obj) throws Exception{
        List<T> objList = queryList(obj);
        if(CollectionUtils.isNotEmpty(objList)){
            return (T)objList.get(0);
        }

        return null;
    }

    /**
     * 插入单条
     * @param obj
     */
    public void insert(T obj)throws Exception{
        if(null != obj) {
            List<T> objs = new ArrayList<T>();
            objs.add(obj);
            insert(objs);
        }
    }

    /**
     * 插入多条
     * @param objs
     */
    public void insert(List<T> objs)throws Exception{
        if(CollectionUtils.isNotEmpty(objs)){
            sqlSession.insert(objs.get(0).getClass().getName()+".insert", objs);
        }
    }

    /**
     * 更新单条
     * @return 更新的条数
     */
    public int update(T obj)throws Exception{
        if(null != obj){
            return sqlSession.update(obj.getClass().getName()+".update", obj);
        }
        return 0;
    }

    /**
     * 更新多条
     * @param objList 更新的obj list
     * @return 更新的条数
     */
    public int update(List<T> objList)throws Exception{
        if(CollectionUtils.isNotEmpty(objList)){
            int execNo = 0;
            for(T e: objList){
                execNo += update(e);
            }
            return execNo;
        }
        return 0;
    }

    /**
     * 物理删除单条
     * @return 删除的条数
     */
    public int delete(T obj)throws Exception{
        if(null != obj){
            return sqlSession.delete(obj.getClass().getName()+".del", obj);
        }
        return 0;
    }

    /**
     * 物理删除多条
     * @param objList 删除的List
     * @return
     */
    public int delete(List<T> objList)throws Exception{
        if(CollectionUtils.isNotEmpty(objList)){
            int execNo = 0;
            for(T e: objList){
                execNo += delete(e);
            }
            return execNo;
        }
        return 0;
    }
}
